Semantik Web • Hafta 07
SWRL: Kurallarla Çıkarım
Kural sözdizimi, built-in'ler, DL-safe kısıt ve alerji ontolojisinin yedi kuralının (S1–S7) tasarımı
Lisansüstü Semantik Web Dersi • CMPE 583
Hafta 07 • Kazanımlar
Bu hafta sonunda
- SWRL kuralını atom atom okuyup yazabileceksiniz.
- Class, individual, object/data property atomlarını doğru kullanabileceksiniz.
- Built-in'lerle aritmetik ve karşılaştırma yapabileceksiniz.
- Kısıtları (yaş, BMI, miktar eşiği) kurala çevirebileceksiniz.
- Kuralı Protégé'de çalıştırıp Java'dan aynı sonucu üretebileceksiniz.
01
Ödev 6'nın Çözümü
BMI uyarı adımının servise eklenmesi.
Çözüm 6.1 — BMIWarning adımı
| Alan | Cevap |
| hasInput | Person (hasWeight, hasHeight bildirilmiş) |
| hasOutput | BMIReport — değer + kategori |
| Precondition | hasWeight(?p,?w) ^ hasHeight(?p,?h) |
| Effect | hasBMI(?p,?b) — S4 kuralı yazar |
| Sequence'te yeri | RunSWRLRules'dan sonra, rapordan önce |
Sıra önemlidir: BMI bir çıkarım ürünüdür, kural motoru çalışmadan okunamaz.
02
SWRL Temelleri
Neden kural? Sözdizimi, atomlar, değişkenler.
OWL neyi ifade edemez?
| İhtiyaç | OWL | SWRL |
| Özellik zinciri sonunda yeni ilişki | Sınırlı (propertyChain) | Doğrudan |
| Aritmetik (BMI, miktar) | Yok | Built-in |
| Sayısal karşılaştırma (yaş ≥ 18) | Veri aralığı ile dolaylı | Doğrudan |
| Metin işleme (kod eşleme) | Yok | Built-in |
| Değişkenli koşul birleşimi | Yok | Gövde atomları |
Projedeki soru tam olarak buradan doğar: "kişinin alerjisini, seçtiği ürünün içerdiği katkı tetikliyorsa" — üç özelliği zincirleyip dördüncü bir ilişki üretmek gerekir.
Kuralın anatomisi
Person(?p) ^ hasAge(?p, ?a) ^ swrlb:greaterThanOrEqual(?a, 18)
-> Adult(?p)
Gövde (antecedent)
Oktan önce. Koşullar VE'lenir.
Baş (consequent)
Oktan sonra. Üretilecek bilgi.
Değişken
?p — soru işareti ile başlar.
Atom türleri
| Tür | Yazım | Projeden örnek |
| Class atom | C(?x) | Person(?p) |
| Object property atom | P(?x, ?y) | Contain(?u, ?f) |
| Data property atom | D(?x, ?v) | hasAge(?p, ?a) |
| Built-in atom | swrlb:fn(...) | swrlb:divide(?b, ?w, ?h2) |
| sameAs / differentFrom | sameAs(?x, ?y) | İki barkodun aynılığı |
| Data range atom | xsd:int(?a) | Tip denetimi |
| Birey sabiti | P(?x, Ind) | Triggers(?f, Lactose) |
Class ve subclass atomları
# Sinif atomu: uyelik kosulu
Person(?p) ^ hasAge(?p, ?a) ^ swrlb:lessThan(?a, 18) -> Minor(?p)
# Alt sinif zaten cikarim uretir; kuralda ust sinif kullanmak yeterli
Adult(?p) ^ Effected_Allergen(?p, ?f) -> AdultAtRisk(?p)
# Sinif atomu bas tarafta: yeni uyelik yazar
Effected_Allergen(?p, ?f) -> PersonAtRisk(?p)
Gövdedeki Adult(?p) atomu, RDFS/OWL çıkarımıyla üretilmiş üyelikleri de görür — kural motoru reasoner'ın sonucu üzerinde çalışır.
Object vs Data property atomu
Object property (OTP)
hasAllergy(?p, ?al)
ChooseProduct(?p, ?u)
Contain(?u, ?f)
Triggers(?f, ?al)
# ikinci arg BIREYDIR
Data property (DTP)
hasAge(?p, ?a)
hasWeight(?p, ?w)
hasHeight(?p, ?h)
hasBMI(?p, ?b)
# ikinci arg DEGERDIR
Karıştırmak en sık hatadır: hasAllergy(?p, "Lactose") asla eşleşmez — Lactose bir bireydir, metin değil.
Güvenli kural: her değişken bağlanmalı
Hatalı
Person(?p)
-> Effected_Allergen(?p, ?f)
# ?f govdede bagli degil
Doğru
Person(?p) ^ ChooseProduct(?p, ?u)
^ Contain(?u, ?f)
-> Effected_Allergen(?p, ?f)
SWRL yeni birey yaratamaz. Baştaki her değişken gövdede bir bireye bağlanmış olmalıdır; aksi hâlde motor kuralı reddeder.
DL-safe kısıt: neden var?
- OWL DL karar verilebilirdir; kural eklemek bu güvenceyi bozabilir.
- Çözüm: kural değişkenleri yalnızca adlandırılmış bireylere bağlanır.
- Sonuç: kural, anonim (çıkarımla var olduğu bilinen) bireyleri görmez.
- Pratik etki: ontolojide bildirilmemiş bireyler üzerinde kural tetiklenmez.
Projede bu bir sorun değildir: bütün kişiler, ürünler, katkılar ve alerjiler adlandırılmış bireylerdir.
Hangi işi hangisi yapsın?
| İş | Araç | Neden |
| Sınıf hiyerarşisi | OWL | Reasoner sınıflandırır |
| Ayrıklık, tutarlılık | OWL | Çelişki denetimi |
| Aritmetik | SWRL | Built-in gerekir |
| Çok özellikli zincir | SWRL | Değişken paylaşımı |
| Eşik/koşul | SWRL | Karşılaştırma built-in'i |
| Sayısal aralık sınıfı | OWL | Veri aralığı kısıtı |
Projedeki iş bölümü: SWRL hesaplar ve zincirler, OWL sınıflandırır ve denetler.
03
Built-in'ler
Karşılaştırma, aritmetik, metin ve tarih işlemleri.
Sık kullanılan built-in'ler
| Grup | Built-in | Kullanım |
| Karşılaştırma | equal, notEqual, lessThan, greaterThanOrEqual | Yaş, BMI eşiği |
| Aritmetik | add, subtract, multiply, divide, pow, round | BMI, miktar |
| Metin | stringConcat, contains, matches, upperCase | Katkı kodu eşleme |
| Tarih | date, dayTimeDuration, subtractDates | Son tüketim tarihi |
| Liste | listConcat, length, member | Toplu içerik işlemleri |
Önek daima swrlb:. SQWRL'in sqwrl: öneki farklıdır — o sorgu içindir (Hafta 10).
Altın kural: sonuç ilk argümandır
swrlb:multiply(?h2, ?h, ?h) → ?h2 = ?h × ?h
swrlb:divide(?b, ?w, ?h2) → ?b = ?w ÷ ?h2
swrlb:add(?t, ?a, 1) → ?t = ?a + 1
Karşılaştırma built-in'lerinde ise sonuç yoktur; atom yalnızca doğru/yanlış döner: swrlb:greaterThan(?a, 18).
Aritmetik: BMI adım adım
Person(?p) ^ hasWeight(?p, ?w) ^ hasHeight(?p, ?h)
^ swrlb:multiply(?h2, ?h, ?h)
^ swrlb:divide(?b, ?w, ?h2)
-> hasBMI(?p, ?b)
TC_004w=91.0 h=1.65 → h2=2.7225 → b=33.43
TC_002w=84.6 h=1.73 → h2=2.9929 → b=28.26
Ara değer ?h2 için ontolojide özellik tanımlamak gerekmez; kural içinde geçici olarak yaşar.
Metin built-in'leri: E-kodu eşleme
# Etiketinde "E3" ile baslayan kod varsa antioksidan say
FoodAdditives(?f) ^ hasCode(?f, ?c)
^ swrlb:matches(?c, "E3[0-9]{2}")
-> Antioxidant(?f)
# Rapor metni uret
Person(?p) ^ hasName(?p, ?n)
^ swrlb:stringConcat(?msg, "RISK: ", ?n)
-> hasWarning(?p, ?msg)
Ascorbic_Acid (E300) → Antioxidant | TC_001 → "RISK: Ayse"
Tarih built-in'i: tazelik denetimi
Product(?u) ^ hasExpiryDate(?u, ?d)
^ swrlb:date(?today, 2026, 9, 9)
^ swrlb:lessThan(?d, ?today)
-> ExpiredProduct(?u)
Dikkat: SWRL'de "bugün" diye bir sabit yoktur — tarihi kural içine gömmek yerine Java tarafından parametre olarak vermek daha doğrudur (Hafta 10).
04
Projedeki Yedi Kural
S1'den S7'ye: tasarım gerekçeleri ve çıktılar.
Kural haritası
| Kural | Girdi | Çıktı | Tür |
| S1_FishRisk | Sodium_Ascorbite | Fish_Allergen | Özel |
| S2_LactoseCasein | Casein | Lactose_Allergen | Özel |
| S3_LactoseNisin | Nisin | Lactose_Allergen | Özel |
| S4_BMI | hasWeight, hasHeight | hasBMI | Aritmetik |
| S5_Adult | hasAge | Adult | Eşik |
| S6_GenericAllergen | Zincir (4 özellik) | Effected_Allergen | Genel |
| S7_RiskClass | Effected_Allergen | PersonAtRisk | Sınıflandırma |
S1_FishRisk — özel kural
Person(?p) ^ hasAllergy(?p, Fish) ^ ChooseProduct(?p, ?u)
^ Contain(?u, Sodium_Ascorbite)
-> Fish_Allergen(?p, Sodium_Ascorbite)
- Alerji ve katkı sabit birey olarak yazılı.
- Okunması kolay, hata ayıklaması kolay.
- Ama her katkı için ayrı kural gerekir — ölçeklenmez.
Tetiklenen: TC_003
(Fish + EAN_00003)
S2 ve S3 — aynı alerji, iki katkı
S2: Person(?p) ^ hasAllergy(?p, Lactose) ^ ChooseProduct(?p, ?u)
^ Contain(?u, Casein) -> Lactose_Allergen(?p, Casein)
S3: Person(?p) ^ hasAllergy(?p, Lactose) ^ ChooseProduct(?p, ?u)
^ Contain(?u, Nisin) -> Lactose_Allergen(?p, Nisin)
S2 → TC_002, TC_003 (Casein) | S3 → TC_001 (Nisin)
İki kural neredeyse aynıdır — bu tekrar, S6'nın neden gerekli olduğunu gösterir.
S4_BMI — aritmetik kural
Person(?p) ^ hasWeight(?p, ?w) ^ hasHeight(?p, ?h)
^ swrlb:multiply(?h2, ?h, ?h) ^ swrlb:divide(?b, ?w, ?h2)
-> hasBMI(?p, ?b)
| Kişi | Kilo / Boy | BMI | Kategori |
| TC_001 | 67.5 / 1.68 | 23.92 | Normal |
| TC_002 | 84.6 / 1.73 | 28.26 | Fazla kilolu |
| TC_003 | 93.0 / 1.87 | 26.60 | Fazla kilolu |
| TC_004 | 91.0 / 1.65 | 33.43 | Obez |
S4'ün sessiz hatası: literal tipi
Çalışmaz
<hasWeight>67.5</hasWeight>
# tip yok → string kabul
# multiply eslesmez
# kural SESSIZCE bos doner
Çalışır
<hasWeight
rdf:datatype="&xsd;double">
67.5
</hasWeight>
Hata mesajı yoktur. Kural çalıştı, hiçbir sonuç üretmedi. Bu yüzden her kuralın beklenen çıktı sayısını önceden yazın.
S5_Adult — eşik kuralı
Person(?p) ^ hasAge(?p, ?a)
^ swrlb:greaterThanOrEqual(?a, 18)
-> Adult(?p)
TC_001 (38) → Adult ✓
TC_002 (13) → ✗
TC_003 (35) → Adult ✓
TC_004 (54) → Adult ✓
TC_002 negatif test durumudur: kural tetiklenmemesi de doğrulanmalıdır. Sadece pozitif sonucu kontrol etmek, yanlış yazılmış eşiği gizler.
S6_GenericAllergen — çekirdek kural
Person(?p) ^ hasAllergy(?p, ?al) ^ ChooseProduct(?p, ?u)
^ Contain(?u, ?f) ^ Triggers(?f, ?al)
-> Effected_Allergen(?p, ?f)
?al iki atomda paylaşılır — döngü burada kapanır. S1–S3'ün tamamının yerini tutar.
S6'nın TC_001 üzerinde eşleşmesi
Person(?p)?p = TC_001
hasAllergy(?p, ?al)?al = Lactose
ChooseProduct(?p, ?u)?u = EAN_00004
Contain(?u, ?f)?f ∈ {Ascorbic_Acid, Nisin, Soy_Lecitin}
Triggers(?f, ?al)yalnızca ?f = Nisin sağlar
→ sonuçEffected_Allergen(TC_001, Nisin)
S7_RiskClass — sınıflandırma
Person(?p) ^ Effected_Allergen(?p, ?f)
-> PersonAtRisk(?p)
Üst özelliği kullanır; S1–S3'ün ürettiği alt özellikler (Lactose_Allergen vb.) RDFS çıkarımıyla buraya yükselir.
PersonAtRisk =
TC_001, TC_002,
TC_003, TC_004
Kurallar birbirini besler
S1 · S2 · S3Lactose_Allergen / Fish_Allergen (alt özellik)
RDFSsubPropertyOf → Effected_Allergen
S6Effected_Allergen (doğrudan, genel)
S7PersonAtRisk
Motor bu sırayı kendisi bulur: Drools ileri zincirleme (forward chaining) yapar, sabit noktaya kadar tekrarlar. Kural sırası yazım sırası değildir.
Kısıtları işleyen kurallar
# K1 — Cocuk + obez: yuksek oncelikli uyari
Person(?p) ^ hasAge(?p, ?a) ^ swrlb:lessThan(?a, 18)
^ hasBMI(?p, ?b) ^ swrlb:greaterThanOrEqual(?b, 25.0)
-> HighPriorityCase(?p)
# K2 — Miktar esigi: 10 mg uzeri alerjen kritik
Person(?p) ^ Effected_Allergen(?p, ?f) ^ hasAmountMg(?f, ?m)
^ swrlb:greaterThan(?m, 10.0)
-> CriticalExposure(?p, ?f)
K1 → TC_002 (13 yaş, BMI 28.26)
Kısıt kuralları — devam
# K3 — Coklu alerjen: iki farkli katki tetikliyorsa
Person(?p) ^ Effected_Allergen(?p, ?f1) ^ Effected_Allergen(?p, ?f2)
^ differentFrom(?f1, ?f2) -> MultiExposurePerson(?p)
# K4 — Guvenli secim: hicbir katki alerjiyi tetiklemiyorsa
Person(?p) ^ ChooseProduct(?p, ?u) ^ Contain(?u, ?f)
^ hasAllergy(?p, ?al) ^ NotTriggers(?f, ?al)
-> SafeChoice(?p, ?u)
K4 dikkat: SWRL'de olumsuzlama yoktur. NotTriggers ayrı bir özellik olarak açıkça bildirilmelidir — açık dünya gereği "tetiklemiyor" bilgisi kendiliğinden doğmaz.
SWRL'de olumsuzlama sorunu
- "Alerjeni olmayan kişi" doğrudan yazılamaz — not atomu yoktur.
- Neden: açık dünya + monotonluk. Eksik bilgi yokluk sayılamaz.
- Çözüm 1: olumsuz bilgiyi açıkça bildir (NotTriggers).
- Çözüm 2: OWL tarafında kapanış aksiyomu + only kısıtı kullan.
- Çözüm 3: SQWRL sorgusunda küme farkı al (Hafta 10).
05
Protégé'de SWRL
Kural yazma, Drools'a aktarma, sonucu geri yazma.
Protégé ekranı: SWRLTab kural listesi
EntitiesIndividuals by classSWRLTabSQWRLTab
NameRule
S4_BMIPerson(?p) ^ hasWeight(?p,?w) ^ hasHeight(?p,?h) ^ swrlb:multiply(?h2,?h,?h) ^ swrlb:divide(?b,?w,?h2) → hasBMI(?p,?b)
S5_AdultPerson(?p) ^ hasAge(?p,?a) ^ swrlb:greaterThanOrEqual(?a,18) → Adult(?p)
S6_GenericAllergenPerson(?p) ^ hasAllergy(?p,?al) ^ ChooseProduct(?p,?u) ^ Contain(?u,?f) ^ Triggers(?f,?al) → Effected_Allergen(?p,?f)
New
Edit
Clone
Delete
Şematik gösterim. Kural adı boş bırakılamaz; ad, hata ayıklarken hangi kuralın çalıştığını söyler.
Protégé ekranı: kural editörü
SWRL Rule Editor
NameS6_GenericAllergen
CommentGenel risk zinciri
Rule
Person(?p) ^ hasAllergy(?p, ?al) ^ ChooseProduct(?p, ?u) ^ Contain(?u, ?f) ^ Triggers(?f, ?al) -> Effected_Allergen(?p, ?f)
✓ Rule is valid
Editör sözdizimini anında denetler. ^ yerine , da yazılabilir; ok -> zorunludur.
Protégé ekranı: Drools akışı
SWRLTab › Drools Rule Engine
1 · OWL+SWRL → Drools
2 · Run Drools
3 · Drools → OWL
Transferred 118 OWL axioms and 7 SWRL rules to rule engine
Ran rule engine. 14 inferred axioms
Transferred 14 inferred axioms to OWL model
Üçüncü düğmeye basılmazsa sonuç yalnızca motorda kalır — ontoloji değişmez. Sınıfta en çok atlanan adım budur.
Protégé ekranı: kural sonrası birey
Individuals by classSWRLTab
Person
TC_001
TC_002TC_003TC_004
Types
Person
Adult · PersonAtRisk (S5, S7)
Property assertions
Effected_Allergen Nisin (S6)
hasBMI 23.92 (S4)
Kural dosyada nasıl duruyor?
<swrl:Imp rdf:about="#S5_Adult">
<swrl:body>
<swrl:AtomList>
<rdf:first>
<swrl:ClassAtom>
<swrl:classPredicate rdf:resource="#Person"/>
<swrl:argument1 rdf:resource="#p"/>
</swrl:ClassAtom>
</rdf:first>
<rdf:rest> ... </rdf:rest>
</swrl:AtomList>
</swrl:body>
</swrl:Imp>
Kural, RDF listesi olarak saklanır. Elle yazmayın — bu yüzden SWRL API kullanıyoruz.
06
Java Tarafı
Class, individual, OTP, DTP ve kuralın kodla kurulması.
Java — Class ve SubClass
OWLClass person = df.getOWLClass(IRI.create(NS + "Person"));
OWLClass atRisk = df.getOWLClass(IRI.create(NS + "PersonAtRisk"));
// Sinif bildirimi
man.addAxiom(ont, df.getOWLDeclarationAxiom(atRisk));
// PersonAtRisk ⊑ Person
man.addAxiom(ont, df.getOWLSubClassOfAxiom(atRisk, person));
Declaration + SubClassOf = Protégé'de "Add subclass" düğmesi
Java — Individual
OWLNamedIndividual tc5 =
df.getOWLNamedIndividual(IRI.create(NS + "TC_005"));
man.addAxiom(ont, df.getOWLClassAssertionAxiom(person, tc5));
// Bireyler farkli olsun (cardinality icin gerekli)
man.addAxiom(ont, df.getOWLDifferentIndividualsAxiom(
tc5, df.getOWLNamedIndividual(IRI.create(NS + "TC_001"))));
ClassAssertionAxiom = Protégé'deki "Types" satırı.
Java — Object Property (OTP)
OWLObjectProperty hasAllergy =
df.getOWLObjectProperty(IRI.create(NS + "hasAllergy"));
// Domain / Range
man.addAxiom(ont, df.getOWLObjectPropertyDomainAxiom(hasAllergy, person));
man.addAxiom(ont, df.getOWLObjectPropertyRangeAxiom(hasAllergy,
df.getOWLClass(IRI.create(NS + "Allergy"))));
// Bildirim: TC_005 hasAllergy Gluten
man.addAxiom(ont, df.getOWLObjectPropertyAssertionAxiom(
hasAllergy, tc5, df.getOWLNamedIndividual(IRI.create(NS + "Gluten"))));
Java — Data Property (DTP)
OWLDataProperty hasAge =
df.getOWLDataProperty(IRI.create(NS + "hasAge"));
man.addAxiom(ont, df.getOWLDataPropertyRangeAxiom(hasAge,
df.getIntegerOWLDatatype()));
// TIPLI literal — S5 kuralinin calismasi icin sart
man.addAxiom(ont, df.getOWLDataPropertyAssertionAxiom(
hasAge, tc5, df.getOWLLiteral(16))); // xsd:int
getOWLLiteral(16) otomatik xsd:int üretir; getOWLLiteral("16") ise string — kural çalışmaz.
Java — S5 kuralını kodla kurmak
SWRLVariable p = df.getSWRLVariable(IRI.create(NS + "p"));
SWRLVariable a = df.getSWRLVariable(IRI.create(NS + "a"));
SWRLAtom c1 = df.getSWRLClassAtom(person, p);
SWRLAtom c2 = df.getSWRLDataPropertyAtom(hasAge, p, a);
SWRLAtom c3 = df.getSWRLBuiltInAtom(
IRI.create("http://www.w3.org/2003/11/swrlb#greaterThanOrEqual"),
Arrays.asList(a, df.getSWRLLiteralArgument(df.getOWLLiteral(18))));
SWRLAtom head = df.getSWRLClassAtom(
df.getOWLClass(IRI.create(NS + "Adult")), p);
man.addAxiom(ont, df.getSWRLRule(
new HashSet<>(Arrays.asList(c1, c2, c3)),
Collections.singleton(head)));
Java — kural motorunu çalıştır
SWRLRuleEngine engine = SWRLAPIFactory.createSWRLRuleEngine(ont);
engine.infer(); // Drools ileri zincirleme
OWLClass adult = df.getOWLClass(IRI.create(NS + "Adult"));
EntitySearcher.getIndividuals(adult, ont)
.forEach(i -> System.out.println("Adult: " + i));
Adult: TC_001 Adult: TC_003 Adult: TC_004
(TC_002 ve TC_005 yok — 18 alti)
07
Ödev ve Proje Adımı
Kendi kural tabanınızı kurun ve doğrulayın.
Ödev 7 — Kural tabanı
- Ontolojinize altı kural yazın: biri aritmetik, biri eşik, biri zincir, biri metin, ikisi kısıt.
- Her kural için beklenen çıktıyı önceden yazın; sonra doğrulayın.
- Bir negatif test durumu kurun (tetiklenmemesi gereken birey).
- Kurallardan birini Java'da SWRL API ile kurun ve çalıştırın.
- Drools → OWL sonrası ontolojiyi kaydedip aksiyom sayısı farkını raporlayın.
Teslim
Kural tablosu (ad, amaç, beklenen/gerçek çıktı) + .owl + Java sınıfı + Protégé ekran görüntüleri.
Çözümü Hafta 08'in başında ele alacağız.
Değerlendirme ölçütleri
| Ölçüt | Ağırlık | Beklenen |
| Kural çeşitliliği | 25% | Altı tür temsil edilmiş |
| Güvenli kural | 15% | Bağlanmamış değişken yok |
| Beklenen çıktı analizi | 20% | Önceden yazılmış, karşılaştırılmış |
| Negatif test | 15% | Tetiklenmeme doğrulanmış |
| Java ile kural kurma | 25% | Kod çalışıyor, sonuç aynı |
Kaynaklar
- W3C — SWRL: A Semantic Web Rule Language Combining OWL and RuleML (2004).
- W3C — SWRL Built-in Specification.
- O'Connor, M. — SWRLAPI ve SWRLTab belgeleri (Stanford BMIR).
- Motik, B., Sattler, U., Studer, R. — Query Answering for OWL-DL with Rules (DL-safe).
- Drools belgeleri — ileri zincirleme ve çakışma çözümü.
Özet • 1 / 2
Kural dili
- Gövde VE'lenmiş atomlardan oluşur; baş tek sonuç üretir.
- Baştaki her değişken gövdede bağlanmalıdır — SWRL birey yaratmaz.
- Built-in'lerde sonuç ilk argümandır; karşılaştırmada sonuç yoktur.
- Literal tipi eksikse kural sessizce boş döner — en pahalı hata.
- Olumsuzlama yoktur; olumsuz bilgi açıkça bildirilir.
Özet • 2 / 2
Proje kuralları ve sonraki adım
- S1–S3 özel, S6 genel: genel kural üçünün yerini tutar.
- S4 hesaplar, S5 eşikler, S7 sınıflandırır.
- Alt özellik hiyerarşisi S7'yi tek satırda tutar.
- Drools → OWL basılmazsa ontoloji değişmez.
Hafta 08'de
Java ile OWL API-I: Maven kurulumu, ontolojiyi sıfırdan programatik kurma, aksiyom yönetimi.
Ayrıca: Ödev 7'nin ayrıntılı çözümü.
Tekrar Soruları
Kendinizi sınayın
- S6, S1–S3'ün yerini nasıl tutuyor?
- multiply(?h2, ?h, ?h) neden bu sırada yazılır?
- Bağlanmamış değişken hatası neye benzer?
- DL-safe kısıt projeyi nasıl etkiliyor?
- Neden "alerjeni olmayan kişi" kuralı yazılamaz?
- Drools → OWL düğmesi atlanırsa ne olur?
- getOWLLiteral("16") hangi hatayı doğurur?
- S7 neden alt özellikleri tek tek yazmıyor?
Alıştırma • Sınıf içi
Kuralı siz yazın
"BMI'si 30'un üzerinde ve riskli ürün seçen kişiler" için bir kural yazın.
Person(?p) ^ ______(?p, ?b)
^ swrlb:______(?b, 30.0)
^ ______(?p, ?f)
-> ______(?p)
Sorular
- Bu kural S4'ten önce çalışabilir mi?
- Hangi kişi tetiklenir?
- Aynı sonucu OWL ile yazabilir miydiniz?
Çözüm Hafta 08'de.